package EnterpriseAlgorithm.Stack_Queue.Code.RealizeBetweenS_And_Q;

import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;

class MyStack_i {

    Queue<Integer> queue1; // 和栈中保持一样元素的队列
    Queue<Integer> queue2; // 辅助队列

    /** Initialize your data structure here. */
    public MyStack_i() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    /**模拟入队 */
    public void push(int x) {
        queue2.offer(x); // 先放在辅助队列中
        while (!queue1.isEmpty()){ // 队列 1 非空时，将队 1 的元素依次出队进入队 2
            queue2.offer(queue1.poll()); // 这个操作使得队 2 拥有与Stack一样的元素顺序
        }
        // 交换两个队列指针的指向，实现交换队列的操作 ,
        // 这个操作是的队 1 拥有与Stack一样的元素顺序，使pop top empty 操作只在队 1 上操作就行
        Queue<Integer> queueTemp;
        queueTemp = queue1;
        queue1 = queue2;
        queue2 = queueTemp;
    }

    /** 模拟出栈*/
    public int pop() {
        if (queue1.isEmpty()) {  // 增加一层安全机制   若队列为空，则抛出异常
            throw new NoSuchElementException("Queue is empty");
        } else {
            return queue1.poll(); // 因为queue1中的元素和栈中的保持一致，所以这个和下面两个的操作只看queue1即可
        }
    }

    /** 获取栈顶元素 */
    public int top() {
        if (queue1.isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        } else {
            return queue1.peek();
        }
    }

    /** 判空 */
    public boolean empty() {
        return queue1.isEmpty();
    }
}